import { _decorator, BoxCollider2D, Component, Contact2DType, Node, RigidBody2D } from 'cc';
import { PlayerManager } from './PlayerManager';
const { ccclass, property } = _decorator;

@ccclass('PbulletManager')
export class PbulletManager extends Component {
    pBulletColliderBox:BoxCollider2D
    isDestory:boolean=false  //标记这个节点为要销毁的节点，延迟销毁
    protected onLoad(): void {
        this.BoxColliderListener()
        this.startBulletMovement()
    }
    // 开始子弹移动
    protected startBulletMovement(): void {
        const moveBullet = () => {
            if(this.node){
                if (this.node.position.y > 500) {
                    this.node.parent.getComponent(PlayerManager).isDestroy = true
                } else {
                    this.node.setPosition(this.node.position.x, this.node.position.y + 20 ) 
                    setTimeout(moveBullet, 100) 
                }
            }else{
                console.log("节点已被销毁")
            }          
        }
        moveBullet()
    }
    // 设置碰撞监听
    BoxColliderListener(){       
            this.pBulletColliderBox= this.node.getComponent(BoxCollider2D)        
            this.pBulletColliderBox.on(Contact2DType.BEGIN_CONTACT,this.onCollisionEnter,this)
        }
    onCollisionEnter(){
        this.node.parent.getComponent(PlayerManager).isDestroy=true
        console.log("碰撞了player子弹和enemy飞机",this.pBulletColliderBox.group)     
        this.isDestory=true 
    }
    /**
     * 主要是碰撞回调的执行间隔时间比较短，再加上节点调用 destroy 之后不会在当前语句执行帧就立即销毁节点对象数据，
     * 而是会把准备销毁的节点记录到引擎的待销毁对象集中。然后统一等引擎下一帧自动进行销毁。
     * 在自动销毁之前，节点暂时还是会被判断为可用。但是实际上已经不可用了。
     * 如果是想要在 box2d 的碰撞回调里面，进行 active 或者 destory 操作，需要隔帧操作。
     * 是会受限于 box2d 的第三方库。另外，设置 0.1秒，也是差不多隔帧操作。
     * 
     * 目前可以通过延迟销毁规避这个问题。
     * 
     * 当在碰撞回调中要销毁一个节点时，可以打一个标记，来代替destory，比如
     * this.isDestory = ture
     * 然后在update或者lateUpdate中判断这个标记来执行 destroy 这样既不会报错，也不用手动写延迟一帧的代码
     * lateUpdate(dt: number) { if(this.isdestory){ this.node.destroy(); } }

     */
    protected update(dt: number): void {
         if(this.isDestory){
            this.isDestory=false
            this.node.destroy()
         }
    }



}

